#ifndef DB_MANAGER_H
#define DB_MANAGER_H

#include "postgresql/libpq-fe.h";
#include "iostream";
#include "sstream";
#include "string";
#include "users.h";
#include "sessions.h";
#include "messages.h";

using namespace std;

class db_manager
{
	private:

		PGconn * conn;
		Users * users;
		Sessions * sessions;
		Messages * messages;

		int db_open( );
		void db_close( );



	public:

		db_manager( );
		int db_create( );
		int db_clean( );

		/*int new_user( char * login, char * pass ) // +-
		{
			char * pass1 = new char( 32 );
			hash( pass, pass1 );
//			strcpy( pass1 , pass1 );
			//			cout << pass1 << endl;
			return users-> InsRecord( login, pass1 ); // поиск нужно отдельно сделать
		}

		int find_user( char * login, int & id )
		{
			return users-> FindRecord( login, id );
		}

		int new_session( int id, int & idsession )
		{
			return sessions-> InsRecord( id, idsession ); // поиск по id
		}

		int GetSession_old( char * login, char * pass, int & idsession ) // +
		{
			// pass -> hash
			// по логину и hash находим iduser
			// создаем сессию

			char * passhash = new char( 32 );
			hash( pass, passhash );
			int iduser;
//			cout << "GetSession( ) pass = " << pass << endl;
//			cout << "GetSession( ) passhash = " << passhash << endl;
			int status = users-> FindRecord( login, passhash, iduser ); // + проверка логина на допустимые знаки
//			cout << "GetSession( ) status = " << status << endl;

			if ( status == DB_OK ) // авторизаци прошла успешно
			{
				status = sessions-> FindRecord( iduser, idsession );
				if ( status == DB_OK ) // сессия активна
				{
					// сессия уже найдена
				}
				if ( status == DB_NO_RECORD ) // нет активной сессии
				{
					status = sessions-> InsRecord( iduser, idsession );
				}

			}
			else
			{
				status = DB_NO_AUTH;
				idsession = 0;
			}

			return status;
		}

		int GetIduser( int idsession, int & iduser )
		{
			return sessions-> GetIduser( idsession, iduser );
		}

		int NewMessage_( int idauthor, int idroom, char * text ) // добавить проверки и номер сессии -
		{
			//return messages-> InsRecord( idauthor, text );
		}

		int SetListMessage( char * name, int & id )
		{
			return 0;
		}*/

		///////////////////////////////////////////////////////// +
		///////////////////////////////////////////////////////// +

		int NewUser( char * login, char * pass );

		int GetSession( char * login, char * pass, int & session );

		int NewMessage( int idsession, char * text );

		///////////////////////////////////////////////////////// +
		///////////////////////////////////////////////////////// +

		int Test( );

	private:

		void hash ( char * _key, char * & hashkey ) // + goto extraclass ?
		{
			char salt1[ 3 ] = "~q";
			char salt2[ 3 ] = "7%";
			char key[ strlen( _key ) + 4 ];
			key[ 0 ] = '\0';
			int key_len = strlen( _key ) + 4;
			strncat( key, salt1, 2 );
			strncat( key, _key, strlen( _key ) );
			strncat( key, salt2, 2 );

//			cout << "hash( ) key = " << key << endl;

			unsigned int hash, i;
			for ( hash = i = 0; i < key_len; i++ )
			{
				hash += key[i];
				hash += ( hash << 10 );
				hash ^= ( hash >> 6 );
			}
			hash += ( hash << 3 );
			hash ^= ( hash >> 11 );
			hash += ( hash << 15 );

//			cout << "hash( ) hash = " << hash << endl;

//			char st[ 11 ] = "";
			//			st [ 0 ] = '\0';
			sprintf( hashkey, "%u", hash );
			//			cout << strlen( st ) << endl;
			//			cout << key << "\t" << st << endl;
		}
};

#endif // DB_MANAGER_H
